var express = require('express');
var path = require('path');

var fortune = require('./lib/fortune.js');

var app = express();

/*设置handlebars视图引擎，
 * 添加一个叫作section 的辅助helpers方法
 * */
var handlebars = require('express3-handlebars').create({
    defaultLayout: 'main',
    helpers: {
        section: function (name, options) {
            if (!this._sections) this._sections = {};
            this._sections[name] = options.fn(this);
            return null;
        }
    }
});

app.engine('handlebars', handlebars.engine);
app.set('view engine', 'handlebars');

/*设置端口*/
app.set('port', process.env.PORT || 5000);

/*设置静态文件路由*/
app.use(express.static(__dirname + '/public'));

/*禁止返回服务器系统信息*/
app.disable('x-powered-by');

/*检测查询字符串中的 test=1,需要放在非测试路由前
 * 如果
 *  test=1 出现在任何页面的查询字符串中（并且不是运行在生产服务器上），
 *  属性 res.locals.showTests 就会被设为 true
 * */
app.use(function (req, res, next) {
    res.locals.showTests = app.get('env') !== 'production' &&
        req.query.test === '1';
    next();
});

/*引入天气数据*/
var weather = require('./lib/weather.js');

/*创建一个中间件给 res.locals.partials 对象添加这些数据*/
app.use(function (req, res, next) {
    if (!res.locals.partials) res.locals.partials = {};
    res.locals.partials.weather = weather.getWeatherData();
    next();
});

app.get('/', function (req, res) {
    res.render('home');
});

/*关于页面*/
app.get('/about', function (req, res) {
    res.render('about', {
        fortune: fortune.getFortune(),
        pageTestScript: '/qa/tests-about.js'
    });
});

/*跨页测试情境路由*/
app.get('/tours/hood-river', function (req, res) {
    res.render('tours/hood-river');
});
app.get('/tours/request-group-rate', function (req, res) {
    res.render('tours/request-group-rate');
});

/*请求头展示*/
app.get('/headers', function (req, res) {
    res.set('Content-Type', 'text/plain');
    var s = '';
    for (var name in req.headers)s += name + ': ' + req.headers[name] + '\n';
    res.send(s);
});

/*渲染纯文本输出*/
app.get('/test', function (req, res) {
    res.type('text/plain');
    res.send('this is a test');
});

/*简单的 GET 节点，只返回 JSON 数据*/
var tours = [
    {id: 0, name: 'Hood River', price: 99.99},
    {id: 1, name: 'Oregon Coast', price: 149.95}
];

app.get('/api/tours', function (req, res) {
    res.json(tours);
});

/*GET 节点，返回 JSON、XML 或 text*/
app.get('/api/tours1', function (req, res) {
    var toursXml = '<?xml version="1.0"?><tours>' +
        tours.map(function (p) {
            return '<tour price="' + p.price +
                '" id="' + p.id + '">' + p.name + '</tour>';
        }).join('') + '</tours>';
    var toursText = tours.map(function (p) {
        return p.id + ': ' + p.name + ' (' + p.price + ')';
    }).join('\n');
    res.format({
        'application/json': function () {
            res.json(tours);
        },
        'application/xml': function () {
            res.type('application/xml');
            res.send(toursXml);
        },
        'text/xml': function () {
            res.type('text/xml');
            res.send(toursXml);
        },
        'text/plain': function () {
            res.type('text/plain');
            res.send(toursText);
        }
    });
});

/*用于更新的 PUT 节点
 * API 用于更新一条数据并且返回 JSON；参数在查询字符串中传递
 * 路由字符串中的'':id'' 命令Express 在req.params 中增加一个id 属性
 * */
app.put('/api/tour/:id', function (req, res) {
    var p = tours.some(function (p) {
        return p.id == req.params.id
    });
    if (p) {
        if (req.query.name) p.name = req.query.name;
        if (req.query.price) p.price = req.query.price;
        res.json({success: true});
    } else {
        res.json({error: 'No such tour exists.'});
    }
});

/*用于删除的 DEL 节点
 *用于删除一个产品
 * */
app.del('/api/tour/:id', function (req, res) {
    var i;
    for (var i = tours.length - 1; i >= 0; i--)
        if (tours[i].id == req.params.id) break;
    if (i >= 0) {
        tours.splice(i, 1);
        res.json({success: true});
    } else {
        res.json({error: 'No such tour exists.'});
    }
});

/*如果你根本不想使用布局，
 *可以在上下文中指定 layout: null
 */
app.get('/foo', function (req, res) {
    res.render('foo', {layout: null});
});

/*如果你想使用一个不同的模板，可以指定模板名称*/
app.get('/foo1', function (req, res) {
    res.render('foo1', {layout: 'microsite'});
});

/*段落（section）演示*/
app.get('/jquerytest', function (req, res) {
    res.render('jquerytest');
});

/*客户端模板nursery rhyme路由和AJAX 调用的路由处理程序*/
app.get('/nursery-rhyme', function (req, res) {
    res.render('nursery-rhyme');
});

app.get('/data/nursery-rhyme', function (req, res) {
    res.json({
        animal: 'squirrel',
        bodyPart: 'tail',
        adjective: 'bushy',
        noun: 'heck'
    });
});

/*定制404页面*/
app.use(function (req, res) {
    res.status(404);
    res.render('404');
});

/*定制500页面*/
app.use(function (err, req, res, next) {
    console.error(err.stack);
    res.status(500);
    res.render('500');
});

app.listen(app.get('port'), function () {
    console.log('Express started on http://localhost:' + app.get('port') + ' ;press Ctrl-C to terminate');
});